package com.molichuxing.framework.utils;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

/**
 * PropertiesUtil.java
 */
public class PropertiesUtil {

	private static PropertiesUtil instance = null;

	public static PropertiesUtil getInstance() {
		if (instance == null) {
			instance = new PropertiesUtil();
		}
		return instance;
	}

	// 根据Key读取Value
	public String getValueByKey(String filePath, String key) {
		try {
			Properties pps = new Properties();
			InputStream in = PropertiesUtil.class.getClassLoader().getResourceAsStream(filePath);
			pps.load(in);
			String value = pps.getProperty(key);
			System.out.println(key + " = " + value);
			return value;

		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return null;
	}

	/**
	 * 读取Properties的全部信息
	 * 
	 * @param filePath
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public Map<String, String> getAllProperties(String filePath) {
		Map<String, String> map = new HashMap<>(32);
		try {
			Properties pps = new Properties();
			InputStream in = PropertiesUtil.class.getClassLoader().getResourceAsStream(filePath);
			pps.load(in);

			// 得到配置文件的名字
			Enumeration en = pps.propertyNames();

			while (en.hasMoreElements()) {
				String strKey = (String) en.nextElement();
				String strValue = pps.getProperty(strKey);
				map.put(strKey, strValue);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return map;
	}

	/**
	 * 读取Properties的全部信息
	 * 
	 * @param filePath
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public List<String> getAllArray(String filePath) {
		List<String> properties = new ArrayList<>();
		try {
			Properties pps = new Properties();
			InputStream in = PropertiesUtil.class.getClassLoader().getResourceAsStream(filePath);
			pps.load(in);

			// 得到配置文件的名字
			Enumeration en = pps.propertyNames();

			while (en.hasMoreElements()) {
				properties.add((String) en.nextElement());
			}
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return properties;
	}

	/**
	 * 写入Properties信息
	 * 
	 * @param filePath
	 * @param pKey
	 * @param pValue
	 * @throws IOException
	 */
	public void writeProperties(String filePath, String pKey, String pValue) throws IOException {
		Properties pps = new Properties();

		InputStream in = new FileInputStream(filePath);
		// 从输入流中读取属性列表（键和元素对）
		pps.load(in);
		// 调用 Hashtable 的方法 put。使用 getProperty 方法提供并行性。
		// 强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。
		OutputStream out = new FileOutputStream(filePath);
		pps.setProperty(pKey, pValue);
		// 以适合使用 load 方法加载到 Properties 表中的格式，
		// 将此 Properties 表中的属性列表（键和元素对）写入输出流
		pps.store(out, "Update " + pKey + " name");
	}

}
